package org.zjt.book
import scala.util.control.Breaks.{break, _}

/**
  * Created by Administrator on 2017/4/29.
  */
class OptionTest (var name:String){

   def apply( name:String): OptionTest = {
    println("-------apply---------")
    new OptionTest(name)
  }

  def unapply(arg: OptionTest): String = {
    println("---------unapply-------")
    this.name
  }


}

object OptionStart extends App{

  /** 1、 得到方法的引用  */
  var method = math.sqrt _
  println(method(2) )

  /** 2、 srting.form格式化*/
  println("%05d".format(12))
  println("当前正在执行：%s".format(2132))



  var option = new OptionTest("zhang")
  // object()：调用类的apply方法
  println(option("zhang"))




  /**
    * valueHand = f 这两个函数是一个函数
    *
    * PS:
    *   valueHand等价于执行 传来的f 函数。
    *
    *   执行传来的 math.sqrt _
    *
    * */
  def valueHand (f:(Double) => Double ) = f(0.25)
  println(valueHand(math.sqrt _))



  /** sum持有函数的对象 */
  val sum = (x:Double) => x+3
  println(sum(5))


  /** 柯里函数：向函数中传入一个函数 */
  def keliMethod(num1 :Double)(num2 :Double):Double = num2 * num1
  println(keliMethod(2.3)(3.43))


  /**
    * 传入函数 = 柯里函数
    * @param num1
    * @return
    */
  def mmethod(num1 :Double) = (num2 :Double)=> num2 * num1
  println(mmethod(2.3)(3.43))


  /** 柯里函数执行元素比较 */
  println( Array(1,2,3,43,54).corresponds(Array(1,2,3,22,54))(_.equals(_)) )



  /** runThread开启线程，并传入执行方法 */
  def runThread( runMethod : => Unit ): Unit ={
    new Thread{
      override def run(): Unit = runMethod
    }.start()
  }

  runThread( println("zhang san") )



  /** return 函数返回 */
  def returnMethod() :Int= {
    var i = 0
    while (true){
      i += 1
      if (i >10) return i
    }
    -1
  }

  println(returnMethod())



  /**
    * 执行break方法
    *   import scala.util.control.Breaks.{break, _}
    * */
  def breakMethod={
    breakable{
      var i = 0
      while (true){
        i += 1
        if (i >10) break
      }
    }
  }

  println(breakMethod)

}